#ifndef CONNECT_POOL_H_
#define CONNECT_POOL_H_

#include <string>
#include <vector>

class Connecter;
class Provider;
class Deliver;

/**
 * @class ConnectPool
 * @brief 提供了连接池的功能，用于管理和异步化与消息代理的连接和通信。
 */
class ConnectPool
{
public:
    /**
     * @brief 构造函数，初始化连接池并设置AMQP地址。
     * @param amqp_address AMQP地址，用于连接消息代理。
     */
    explicit ConnectPool(const std::string &amqp_address);

    /**
     * @brief 析构函数，释放连接池中的所有资源。
     */
    ~ConnectPool();

    /**
     * @brief 初始化连接池，创建指定数量的工作线程。
     * @param thread_num 工作线程的数量，决定了并行处理的能力。
     */
    void init(int thread_num);

    /**
     * @brief 添加消息提供者到连接池。
     * @param provider 消息提供者，用于生产消息到消息代理。
     */
    void addProvider(Provider *provider);

    /**
     * @brief 分发消息到所有连接器。
     * @param deliver 消息分发者，包含要发送的消息。
     */
    void dispatch(Deliver *deliver);

private:
    /**
     * @brief 存储AMQP地址，用于连接消息代理。
     */
    std::string amqp_address_;

    /**
     * @brief 存储所有连接器的指针，管理连接池中的连接。
     */
    std::vector<Connecter *> connecters_;

    /**
     * @brief 记录最后一个线程的索引，用于调度算法。
     */
    int last_thread_index_;
};

#endif // CONNECT_POOL_H_